/**
 * @constructor
 * @param {number} val
 * @param {ListNode|null} [next]
 */
function ListNode(val, next) {
    /** @type {number} */
    this.val = (val === undefined ? 0 : val)
    /** @type {ListNode|null} */
    this.next = (next === undefined ? null : next)
}

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var hasCycle = function (head) {
    //使用一个快指针和一个慢指针
    //快指针每次走2步，慢指针每次走1步
    //如果有环，快慢指针相遇时，快指针套了慢指针n圈
    //如果无环，会走到空节点或者最后一个节点，退出循环
    let fast = head
    let slow = head
    while (fast && fast.next) { //快指针指向末尾或者末尾的下一个null
        fast = fast.next.next
        slow = slow.next
        if (slow === fast) {
            return true
        }
    }
    return false
};